package com.efast.dmom.mgmt.service.mes;

import java.util.List;
import java.util.Map;

import com.efast.cafe.framework.bean.ResultBean;
import com.efast.dmom.mgmt.bean.mes.ProductExcuteDto;
import com.efast.dmom.mgmt.bean.mes.ReportDto;
import com.efast.dmom.mgmt.bean.mes.WorkOrderInfoDto;
import com.efast.dmom.mgmt.entity.les.TwInbTaskDetail;
import com.efast.dmom.mgmt.entity.les.TwOutbTaskDetail;
import com.efast.dmom.mgmt.entity.les.TwPacktranTaskDetail;
import com.efast.dmom.mgmt.entity.les.TwQualityTaskDetail;
import com.efast.dmom.mgmt.entity.mes.TwBasLot;
import com.efast.dmom.mgmt.utils.Assist;


public interface TwBasLotService {
	/**
	 * 获得TwBasLot数据的总行数,可以通过辅助工具Assist进行条件查询,如果没有条件则传入null
	 * 
	 * @param assist
	 * @return
	 */
	long getTwBasLotRowCount(Assist assist);

	/**
	 * 获得TwBasLot数据集合,可以通过辅助工具Assist进行条件查询,如果没有条件则传入null
	 * 
	 * @param assist
	 * @return
	 */
	List<TwBasLot> selectTwBasLot(Assist assist);

	/**
	 * 获得一个TwBasLot对象,以参数TwBasLot对象中不为空的属性作为条件进行查询
	 * 
	 * @param obj
	 * @return
	 */
	TwBasLot selectTwBasLotByObj(TwBasLot obj);

	/**
	 * 通过TwBasLot的id获得TwBasLot对象
	 * 
	 * @param id
	 * @return
	 */
	TwBasLot selectTwBasLotById(Integer id);
	
	/**
	 * 通过TwBasLot的lotName获得TwBasLot对象
	 * 
	 * @param lotName
	 * @return
	 */
	Map selectTwBasLotByName(String lotName);

	/**
	 * 插入TwBasLot到数据库,包括null值
	 * 
	 * @param value
	 * @return
	 */
	int insertTwBasLot(TwBasLot value);

	/**
	 * 插入TwBasLot中属性值不为null的数据到数据库
	 * 
	 * @param value
	 * @return
	 */
	int insertNonEmptyTwBasLot(TwBasLot value);

	/**
	 * 批量插入TwBasLot到数据库
	 * 
	 * @param value
	 * @return
	 */
	int insertTwBasLotByBatch(List<TwBasLot> value);

	/**
	 * 通过TwBasLot的id删除TwBasLot
	 * 
	 * @param id
	 * @return
	 */
	int deleteTwBasLotById(Integer id);

	/**
	 * 通过辅助工具Assist的条件删除TwBasLot
	 * 
	 * @param assist
	 * @return
	 */
	int deleteTwBasLot(Assist assist);

	/**
	 * 通过TwBasLot的id更新TwBasLot中的数据,包括null值
	 * 
	 * @param enti
	 * @return
	 */
	int updateTwBasLotById(TwBasLot enti);

	/**
	 * 通过辅助工具Assist的条件更新TwBasLot中的数据,包括null值
	 * 
	 * @param value
	 * @param assist
	 * @return
	 */
	int updateTwBasLot(TwBasLot value, Assist assist);

	/**
	 * 通过TwBasLot的id更新TwBasLot中属性不为null的数据
	 * 
	 * @param enti
	 * @return
	 */
	int updateNonEmptyTwBasLotById(TwBasLot enti);

	/**
	 * 通过辅助工具Assist的条件更新TwBasLot中属性不为null的数据
	 * 
	 * @param value
	 * @param assist
	 * @return
	 */
	int updateNonEmptyTwBasLot(TwBasLot value, Assist assist);

	/**
	 * 产品执行过程中lot数据处理：更新lot状态及保存lot历史信息
	 * 
	 * @param dto
	 */
	void dealLotDatas(ProductExcuteDto dto);
	
	/**
	 * 产品执行当是合拼工位过程中lot数据处理：更新lot状态及保存lot历史信息
	 * 
	 * @param dto
	 */
	void dealSpliceSelfnumber(ProductExcuteDto dto);
	
	/**
	 *产品执行中校验lot中是否有保存采集数据
	 * 
	 * @param dto
	 */
	boolean dealRowDate(TwBasLot lot);

	/**
	 * lot生产执行中保存相关数据，如：物料消耗、数据检测、数据采集等
	 * 
	 * @param dto
	 * @return
	 */
	String doSaveDatas(ProductExcuteDto dto);

	/**
	 * 
	 * @param lotNames
	 * @param workOrderInfo
	 * @return
	 */
	void packingBox(Map<Object, Object> map);

	/**
	 * 指定之间段内的产线产量
	 * 
	 * @param sDate
	 * @param eDate
	 * @return
	 */
	List<ReportDto> getLineCapacity(String sDate, String eDate);

	/**
	 * 指定时间段内的工位产量
	 * 
	 * @param sDate
	 * @param eDate
	 * @return
	 */
	List<ReportDto> getStationCapacity(String sDate, String eDate);

	/**
	 *
	 * @param lineName
	 * @param sDate
	 * @param eDate
	 * @return
	 */
	List<ReportDto> getStGoodRate(String lineName, String sDate, String eDate);

	/**
	 * 指定时间段内的异常统计
	 * 
	 * @param params
	 * @return
	 */
	List<ReportDto> getAbnormalInfo(ReportDto params);
	
	/**
	 * 入库
	 * @param dto
	 */
	void doWarehousing(WorkOrderInfoDto dto);
	/**
	 * 流程卡打印
	 * @param dto
	 */
	void printFlowCard(TwBasLot lot);
	/**
	 * 打印翻包标签
	 * @param twPacktranTaskDetails
	 */
	void printTurnOverCard(List<TwPacktranTaskDetail> twPacktranTaskDetails);
	/**
	 * 打印质检标签
	 * @param twQualityTaskDetail
	 */
	void printQualityTestingCard(TwQualityTaskDetail twQualityTaskDetail);
	/**
	 * 打印上架清单
	 * @param dbListTwInbTaskDetail
	 */
	void printGroundingList(List<TwInbTaskDetail> dbListTwInbTaskDetail);
	/**
	 * 打印拣货任务单
	 * @param listTwOutbTaskDetail
	 * @param custsheetNo 
	 */
	void printPickCard(List<TwOutbTaskDetail> listTwOutbTaskDetail, String custsheetNo);
	/**
	 * 查找成品是否有缺陷
	 * @param listTwOutbTaskDetail
	 * @param custsheetNo 
	 */
	TwBasLot getDefFromLotName(String lotName);
	
	/**
	 * 根据lotID，关闭lot
	 * @param lotName
	 * 
	 */
	boolean closeLot(Integer lotID);
	/**
	 * 根据lotID，报废lot
	 * @param lotName
	 * 
	 */
	boolean scrapLot(Integer lotID);
	
	public ResultBean generateVin(String bsn, String vin);
	
	public ResultBean validateVIN(String bsn, String vin);
	
	/**
	 * 根据lotID，报废lot
	 * @param lotName
	 * 
	 */
	public ResultBean searchLotByselfNumber(Map<String,Object> map);
	
	void dealSpliceLotDatas(TwBasLot twBasLot);
	
	// 校验是否查询出VIN号
	boolean valliVinExist(Map<String,Object> map);
	
	// 通过lot的selfNumber查询lot
	ResultBean selelotByctselfNumberAndlotName(String lotName,String selfNumber);

	//对LOT进行冻结
	ResultBean freezeLot(List<TwBasLot> twBasLot);
    
	//解冻Lot
	ResultBean scrapLotState(List<TwBasLot> twBasLot);
	
	//车辆关闭、冻结、报废、解冻修改工单状态以及工单item状态
	public ResultBean updateWorkOrderStatus(String orderStatus,String orderItemStatus,String lotStatus,List<TwBasLot> twBasLot);
}